package com.insa.flopenshop;

/**
 * Classe qui permet de stoker les informations sur le placement d'une sous tache sur une ressource universelle
 * @author Luc DUZAN
 *
 */
public class Placement {
	/**
	 * Date de commencement de la sous tâche
	 */
	private int dateDepart;
	
	/**
	 * Instance du problème de la sous tâche placé
	 */
	private Instance instance;
	
	/**
	 * Numéro de la tâche de la sous tâche
	 */
	private int ressourceUniverselle;
	
	/**
	 * Numéro de la ressource dédiée sur laquelle s'éxecute la machine
	 */
	private SousTache sousTache;

	/**
	 * 
	 * @param depart date de départ
	 * @param instance instance du problème qui contient la sous tâche placé
	 * @param numTache le numéro de la tâche de la sous tâche à placé
	 * @param numRessourceDedie numéro de la machine correspondant à notre sous tâche
	 */
	@Deprecated
	public Placement(int depart, Instance instance, int tache, int ressourceDedie, int ressourceUniverselle) {
		this.dateDepart = depart;
		this.instance = instance;
		this.ressourceUniverselle = ressourceUniverselle;
		this.sousTache = new SousTache(instance, tache, ressourceDedie);
	}
	
	
	public Placement(int date, Instance instance, SousTache sousTache, int ressourceUniverselle) {
		this(date, instance, sousTache.getTache(), sousTache.getRessourceDedie(), ressourceUniverselle);
	}


	public int getRessourceUniverselle() {
		return ressourceUniverselle;
	}

	@Override
	public String toString() {
		return String.format("Placement(dateDepart : %d, tache : %d, ressourceDedie : %d, ressourceUniverselle : %d, dateFin : %d)", dateDepart, getTache(), getRessourceDedie(), getRessourceUniverselle(), getDateFin());
	}
	
	public int getDateDepart() {
		return dateDepart;
	}
	
	public void setDateDepart(int dateD) {
		dateDepart = dateD;
	}
	
	public Instance getInstance() {
		return instance;
	}
	
	public int getTache() {
		return sousTache.getTache();
	}
	
	public int getRessourceDedie() {
		return sousTache.getRessourceDedie();
	}
	
	public int getDateFin() {
		return dateDepart + sousTache.getTime();
	}

	public SousTache getSousTache() {
		return sousTache;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + dateDepart;
		result = prime * result + getRessourceDedie();
		result = prime * result + getRessourceUniverselle();
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Placement other = (Placement) obj;
		if (dateDepart != other.dateDepart)
			return false;

		return sousTache.equals(((Placement)obj).sousTache);
	}


	public void setRessourceUniverselle(int idRU) {
		this.ressourceUniverselle = idRU;
	}
}
